web-dev-qa-db-ja.com

Python-OpenCVで `cv2.inRange`を使用して2つの異なる色を検出する方法は?

赤と青など、2つの異なる色の「下」と「上」の範囲を定義するにはどうすればよいですか(HSV色では赤と青が隣り合っていないため)。

これは赤に属しています:

lower_red = np.array([160,20,70])
upper_red = np.array([190,255,255])

これは青に属しています:

lower_blue = np.array([101,50,38])
upper_blue = np.array([110,255,255])

If条件を使用してそれらを組み合わせようとしたり、独自の機能を作成したが機能しない場合、解決策を教えていただけますか?

P/s:OpenCV in Python

15

colorsの2つのマスクを取得したら、cv2.bitwise_orを使用して最終的なマスクを取得します。

import cv2

## Read
img = cv2.imread("sunflower.jpg")

## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

## mask of green (36,0,0) ~ (70, 255,255)
mask1 = cv2.inRange(hsv, (36, 0, 0), (70, 255,255))

## mask o yellow (15,0,0) ~ (36, 255, 255)
mask2 = cv2.inRange(hsv, (15,0,0), (36, 255, 255))

## final mask and masked
mask = cv2.bitwise_or(mask1, mask2)
target = cv2.bitwise_and(img,img, mask=mask)

cv2.imwrite("target.png", target)

ソース:

enter image description here

緑と黄色を見つける(範囲はそれほど正確ではありません):

enter image description here


ところで、より正確な範囲を取得するために、これは私の関連する回答の参照マップです:

画像内の緑色のオブジェクトのみを検出するためのしきい値を定義する方法:Opencv

enter image description here

29
Kinght 金

以下の画像は、色相、彩度、明度(または明度)を使用して機能するHSV色空間を示しています。

HSV Colour Space

HSV色空間で作業する場合、これを覚えておくことが重要であり、Red&Greenなどの概念は、別のデータ型への一種の変換です。

上境界と下境界は、この空間内の1つのポイントのみにすることができますが、赤と青のスペクトルの一部、つまり紫を含めることができます。必要な処理出力の基準を満たすしきい値を選択する必要があります。

どちらか、または2つの別々のループを実行します。1つ目は赤をしきい値処理し、2つ目は青をしきい値処理してから、OpenCVブレンド関数を使用して2つの画像をブレンドします。 2つの色空間のブレンドについては こちら を参照してください。

2
GPPK
# Make a copy of the image

image_copy = np.copy(image)
## TODO: Define the color selection boundaries in RGB values
# play around with these values until you isolate the blue background

lower_blue = np.array([200,0,0]) 
upper_blue = np.array([250,250,255])

# Define the masked area

mask = cv2.inRange(image_copy, lower_blue, upper_blue)
# Vizualize the mask

plt.imshow(mask,cmap='gray')
0
Abhishek yadav